#ifndef DATABASE_TABLE_H
#define DATABASE_TABLE_H

#include <QWidget>
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlRecord>
#include <QSqlQuery>
#include <QJsonDocument> // 解析 JSON 文档
#include <QJsonObject>   // 操作 JSON 对象
#include <QJsonArray>    // 操作 JSON 数组
#include <QJsonValue>    //
#include <QFile>
#include <QPropertyAnimation>
#include "mycustomplot.h"
#include "datablockinfo.h"
namespace Ui
{
    class database_table;
}
class database_table : public QWidget
{
    Q_OBJECT

public:
    explicit database_table(QWidget *parent = nullptr);
    ~database_table();
    bool processJsonCommand(const QString &jsonStr, QString *err); // 解析json命令并处理,返回err
signals:
    void signalToForward(const QString &msg);
private slots:

    void on_ckb_dis_point_toggled(bool checked);

    void on_pb_down_set_released();

    void on_tb_channal1_color_released();

    void on_tb_channal2_color_released();

    void on_tb_channal3_color_released();

    void on_tb_channal4_color_released();

    void on_pb_open_toggled(bool checked);

    void on_ckb_auto_dis_x_toggled(bool checked);
    void on_ckb_auto_dis_y_toggled(bool checked);

    void on_ckb_channal1_toggled(bool checked);

    void on_ckb_channal2_toggled(bool checked);

    void on_ckb_channal3_toggled(bool checked);

    void on_ckb_channal4_toggled(bool checked);

    void on_pb_auto_released();
    void on_comboBox_select_currentTextChanged(const QString &arg1);

    void on_pushButton_quary_clicked();

    void on_radioButton_history_toggled(bool checked);

    void on_radioButton_real_toggled(bool checked);

    void on_radioButton_chart_toggled(bool checked);

    void on_radioButton_table_toggled(bool checked);

protected:
    void keyPressEvent(QKeyEvent *event);   /*键盘按下事件*/
    void keyReleaseEvent(QKeyEvent *event); /*键盘松开事件*/
    void timerEvent(QTimerEvent *event);
private slots:
    void on_pb_dis_clicked();
    void on_pb_full_clicked();

    void on_cb_channal1_param_currentIndexChanged(int index);

    void on_cb_channal1_param_currentTextChanged(const QString &arg1);

    void on_cb_channal2_param_currentTextChanged(const QString &arg1);

    void on_cb_channal3_param_currentTextChanged(const QString &arg1);

private:
    Ui::database_table *ui;
    qint64 firstTimestamp;                              // 记录第一批数据的时间戳
    QDateTime lastStorageTime;                          // 上次存储时间
    static const int STORAGE_INTERVAL = 10 * 60 * 1000; // 10分钟间隔（毫秒）
    bool isExpanded = false;
    int menuWidth;
    bool isFullScreen = false;
    QWidget *fullscreenWindow = nullptr;
    QLayout *originalLayout = nullptr;
    int originalIndex = -1;
    QWidget *originalParent = nullptr;
    QRect originalGeometry;
    typedef struct
    {
        QQueue<QVariant> data;      /*数据队列*/
        QString data_type;          /*该数据是什么数据,也就是哪一列，哪一个安装位置*/
        QColor curve_color;         /*图例与曲线颜色*/
        bool is_visiable;           /*是否显示*/
        double plotCounter;         /*计数*/
        QQueue<QDateTime> dateTime; /*x轴时间*/

    } STRUCT_DATA_QUEUE; /*一共四条线，每条线都记录这个结构体*/

    QMap<int, STRUCT_DATA_QUEUE>
        curve_store_map;                            /*曲线索引对应该曲线的参数*/
    QMap<QString, QList<paramInfo>> blockParamsMap; // 缓存参数，可以通过表名获取所有里面的安装块信息
    QMap<QString, QStringList> table_list;          // key是表名，value是表下的所有列名称
    // QMap<QString, QStringList> table_list_last;          // key是表名，value是表下的所有列名称 旧表
    QMap<QString, QStringList> database_existing_tables; // 存储初始化时数据库中已存在的表和列
    void initializeDatabaseStructure();                  // 初始化时获取数据库现有结构
    int sample_rate = 1000;
    const QString dbPath = "sqliteTemp_test.db";
    QSqlDatabase sqlDataBase;
    MyCustomPlot *m_dataCustomplot;
    int refreshTimer; // 用来实时入列刷新数据用
    bool tracerEnable = false;
    bool is_auto_x_dis = false;
    bool is_auto_y_dis = false;
    QCPGraph *tracerGraph;     // 游标要吸附哪个graph
    QCPItemTracer *plotTracer; /*游标*/
    QCPItemText *plotText;     /*游标文本*/
    QString plotSelectedName;  /*游标选中的曲线名称*/
    bool compareNonEmptyStrings(const QString &str1,
                                const QString &str2,
                                const QString &str3);
    void createTablesFromMap();
    void updateBlockInfoLayout();
    void loadDataToTable(const QString &tableName, const QDateTime &startTime, const QDateTime &endTime, QTableWidget *tableWidget);
    void loadDataToChart(const QString &tableName);
    void loadDataToMaps(const QString &tableName, const QStringList &columns, QMap<QString, QMap<QDateTime, QVariant>> &dataMaps);
    void init_wavepage();
    void update_graph();
    void tool_button_color_rendering(QToolButton *tool_button);
    void param_update(QString data, QString data_type);
    void init_customplotStyleSheet();
    void updateChartDisplay();
    void addIconToToolButton(QToolButton *toolButton, const QString &iconPath);
};

#endif // DATABASE_TABLE_H
